public class code03 {
//    力扣 150 搜索旋转排序数组
public int search(int[] nums, int target) {
    // 解决这道题目使用的仍然是二分法
    // 但是需要注意的一点是，常规的二分法其数组中的元素是 递增的
    // 但是在这里，数组因为旋转，所以并不是递增的

    // 所以，在这里使用二分查找，在 while 循环中要做两件事
    // 1、针对这个数组不断划分找到有序的部分
    // 2、在有序的这半部分中尝试寻找 target 目标值

    // 首先尝试获取数组的长度并且处理边界情况
    int len = nums.length;
    if (len == 0) {
        return -1;
    }

    // 尝试获取现在数组的左右编辑
    int left = 0;
    int right = len - 1;

    // 进行 while 循环判断
    while (left <= right) {

        // 尝试获取中间点
        int mid = (left + right) / 2;

        // 通过加逼的方式，最终会获取到中间点上的目标值
        if (nums[mid] == target) {
            return mid;
        }

        // 在二分查找中数组是递增的，所以..
        if (nums[mid] < nums[right]) {
            // 此时说明右半部分有序
            // 在右半部分锁定目标值
            if (target > nums[mid] && target <= nums[right]) {
                // 收紧左边界
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        } else {
            // 左半部分有序
            // 在左半部分锁定目标值
            if (target >= nums[left] && target < nums[mid]) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
    }
    // 完成后如果没有则返回 -1
    return -1;
}
}
